#ifndef LIBCELL_DELAUNAY_H_
#define LIBCELL_DELAUNAY_H_
#include<Mesh/_Func_.h>
#include<Matrix/LB_Matrix.h>


#ifdef __cplusplus
extern "C" {
#endif
//返回n-1阶代数余子式，也叫广义外积，也等价反对称张量
// double* temp_normal_vector(LB_Matrix* A)
// {
// //A.cols=A.rows+1,且A.cols是向量空间维数
//     int dim=A->rows;
//     double * re=(double*)malloc(sizeof(double)*(dim+1)); 
//     Eigen::MatrixXd temp;
//     temp.resize(dim,dim);
//     int l=0;
//     for(int i=0;i<dim+1;i++)
//     {
//         for(int k=0;k<dim;k++)
//         {
//             l=0; 
//             for(int j=0;j<dim+1;j++)
//             {
//                 if(j!=i)
//                 {
//                     temp.coeffRef(k,l)=A.coeff(k,j);
//                     l++;
//                 } 
//             }
//         }
//         re[i]=temp.determinant();
//         if((dim-i)%2==1)
//         {
//             re[i]=-re[i];   
//         } 
//     }
//     return re;
// }

//rows代表点数，cols代表背景空间
//输入cols维背景空间rows个点，输出带符号的体积数值
//关于这些概念最正确的定义和阐述来自反对称张量
double ori_area_simplex(double ** M,int rows,int cols);

//输入cols维背景空间rows个点，输出体积数值
//rows代表点数，cols代表背景空间，比如3,7表示7维背景空间下三角形(单形))
double area_simplex(double**M,int rows,int cols);

void increasing_convex_hull(template_m* mesh,template_v* v);

//mesh是只包含顶点集合的mesh
void mesh_createconvex(template_m*m);



//给一个包含顶点数据的数组，会得到凸包网格
void  from_v_createconvex(template_m* mesh,double** VV,int rows,int cols);

//delaunay 剖分

void delaunay_triangulation_from_mesh(template_m* m);

//可以定义广义的反转边（高维），但是这种反转边不能等价凸调整，只有二维流形的delauny剖分的反转边等价凸调整
bool libcell_is_flip(template_m*mesh,template_f*f);
#ifdef __cplusplus
}
#endif




#endif
